package web;

import dtos.EncomendaDTO;
import dtos.FarmaciaDTO;
import dtos.FornecedorDTO;
import dtos.LinhaEncomendaDTO;
import dtos.ProdutoCatalogoDTO;
import dtos.ProdutoDTO;
import ejbs.AdministradorBean;
import ejbs.EncomendaBean;
import ejbs.FarmaciaBean;
import ejbs.FornecedorBean;
import ejbs.LinhaEncomendaBean;
import ejbs.ProdutoBean;
import ejbs.ProdutoCatalogoBean;
import excecoes.EntidadeNaoExistenteException;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import utils.FacesExceptionHandler;

/**
 *
 * @author Diogo
 */
@javax.faces.bean.ManagedBean
@SessionScoped

public class AdministradorManager implements Serializable {

    static final Logger logger = Logger.getLogger("web.AdministradorManager");

    @EJB
    private ProdutoBean produtoBean;
    private final ProdutoDTO produtoNovo;
    private ProdutoDTO produtoAtual;
    private UIComponent componente;
    @EJB
    private FarmaciaBean farmaciaBean;
    private FarmaciaDTO farmaciaAtual;

    @EJB
    private ProdutoCatalogoBean produtoCatalogoBean;
    private final ProdutoCatalogoDTO produtoCatalogoNovo;
    private ProdutoCatalogoDTO produtoCatalogoAtual;

    @EJB
    private FornecedorBean fornecedorBean;

    @EJB
    private EncomendaBean encomendaBean;
    private final EncomendaDTO encomendaNovo;
    private EncomendaDTO encomendaAtual;

    @EJB
    private LinhaEncomendaBean linhaEncomendaBean;
    private final LinhaEncomendaDTO LinhaEncomendaNovo;
    private LinhaEncomendaDTO linhaEncomendaAtual;

    @EJB
    private AdministradorBean administradorBean;

    public AdministradorManager() {
        produtoNovo = new ProdutoDTO();
        produtoCatalogoNovo = new ProdutoCatalogoDTO();
        encomendaNovo = new EncomendaDTO();
        LinhaEncomendaNovo = new LinhaEncomendaDTO();
    }

    //--------------------PRODUTOS-------------------
    public String criarProduto() {
        try {
            produtoBean.criarProduto(produtoNovo.getPreco(),
                    produtoNovo.getPrincipioAtivo(),
                    produtoNovo.getLaboratorio(),
                    produtoNovo.getNome(),
                    produtoNovo.getFornecedor(),
                    produtoNovo.getFornecedorAlternativo()
            );
            produtoNovo.reiniciar();
            return "admin_produto_index";

        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_produto_criar";
    }

    public List<ProdutoDTO> getProdutos() {
        try {
            return produtoBean.getAllProdutos();
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de Produtos.", logger);
            return null;
        }
    }

    public String actualizarProduto() {
        try {
            produtoBean.atualizar(produtoAtual.getNome(), produtoAtual.getPreco(),
                    produtoAtual.getPrincipioAtivo(), produtoAtual.getLaboratorio(),
                    produtoAtual.getFornecedor(), produtoAtual.getFornecedorAlternativo());
            return "admin_produto_index?faces-redirect=true";
        } catch (EntidadeNaoExistenteException e) {
            FacesExceptionHandler.tratarExcecaoBinding(e, e.getMessage(), componente, logger);
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_produto_editar";
    }

    public ProdutoDTO getProdutoNovo() {
        return produtoNovo;
    }

    public String setProdutoActualByNome(String nome) {
        produtoAtual = produtoBean.getProduto(nome);
        return "admin_produto_editar";
    }

    public ProdutoBean getProdutoBean() {
        return produtoBean;
    }

    public void setProdutoBean(ProdutoBean produtoBean) {
        this.produtoBean = produtoBean;
    }

    public ProdutoDTO getProdutoAtual() {
        return produtoAtual;
    }

    public void setProdutoAtual(ProdutoDTO produtoAtual) {
        this.produtoAtual = produtoAtual;
    }

    //-------------------FARMACIAS----------------------------
    public FarmaciaDTO getFarmaciaAtual() {
        return farmaciaAtual;
    }

    public void setFarmaciaAtual(FarmaciaDTO farmaciaAtual) {
        this.farmaciaAtual = farmaciaAtual;
    }

    public List<FarmaciaDTO> getFarmacias() {
        try {
            String user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
            return farmaciaBean.getAllFarmacias(user);
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de Farmacias.", logger);
            return null;
        }
    }

    public String setFarmaciaAtualByNome(String nome) {
        farmaciaAtual = farmaciaBean.getFarmacia(nome);
        return "admin_farmacia_index.xhtml";
    }

    //---------PRODUTOCATALOGO------------
    public ProdutoCatalogoDTO getProdutoCatalogoAtual() {
        return produtoCatalogoAtual;
    }

    public ProdutoCatalogoDTO getProdutoCatalogoNovo() {
        return produtoCatalogoNovo;
    }

    public void setProdutoCatalogoAtual(ProdutoCatalogoDTO produtoCatalogoAtual) {
        this.produtoCatalogoAtual = produtoCatalogoAtual;
    }

    public String criarProdutoCatalogo() {
        try {
            produtoCatalogoBean.criarProdutoCatalogo(produtoCatalogoNovo.getReferencia(), produtoCatalogoNovo.getProduto(),
                    produtoCatalogoNovo.getLimiteCritico(), farmaciaAtual.getNome());
            produtoCatalogoNovo.Reiniciar();
            return "admin_farmacia_produto_index";

        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_farmacia_produto_criar";
    }

    public List<ProdutoCatalogoDTO> getProdutoCatalogos() {
        try {
            return produtoCatalogoBean.getAllProdutoCatalogos(farmaciaAtual.getNome());
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de produtos de catalogo.", logger);
            return null;
        }
    }

    public List<ProdutoCatalogoDTO> getProdutoCatalogosNoCritico() {
        try {
            List<ProdutoCatalogoDTO> produtos = produtoCatalogoBean.getAllProdutoCatalogos(farmaciaAtual.getNome());
            List<ProdutoCatalogoDTO> produtosCriticos = new LinkedList<>();
            for (ProdutoCatalogoDTO produto : produtos) {
                if (produto.getQuantidade() < produto.getLimiteCritico()) {
                    produtosCriticos.add(produto);
                }
                return produtosCriticos;
            }
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de produtos de catalogo.", logger);

        }
        return null;
    }

    public String setProdutoCatalogoActualByNome(Long id) {
        produtoCatalogoAtual = produtoCatalogoBean.getProdutoCatalogo(id);
        return "admin_farmacia_produto_editar";
    }

    public String actualizarProdutoCatalogo() {
        try {
            produtoCatalogoBean.atualizaProdutoCatalogo(produtoCatalogoAtual.getId(), produtoCatalogoAtual.getReferencia(),
                    produtoCatalogoAtual.getProduto(), produtoCatalogoAtual.getLimiteCritico(), produtoCatalogoAtual.getFarmacia());
            return "admin_farmacia_produto_index?faces-redirect=true";
        } catch (EntidadeNaoExistenteException e) {
            FacesExceptionHandler.tratarExcecaoBinding(e, e.getMessage(), componente, logger);
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_farmacia_produto_editar";
    }

    //-----------FORNECEDORES--------------
    public List<FornecedorDTO> getFornecedores() {
        try {
            return fornecedorBean.getFornecedores();
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de Fornecedores.", logger);
            return null;
        }
    }

    //----------ENCOMENDAS------------

    public List<EncomendaDTO> getEncomendas() {
        try {
            return encomendaBean.getAllEncomendas(farmaciaAtual.getNome());
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de Encomendas.", logger);
            return null;
        }
    }

    public String fecharEncomenda(Long id) {
        encomendaBean.fecharEncomenda(id);
        return "admin_farmacia_carrinho_index.xhtml";
    }

    public String setEncomendaAtualById(Long id) {
        encomendaAtual = encomendaBean.getEncomenda(id);
        return "admin_farmacia_carrinho_linha.xhtml";
    }

    public String criarEncomenda() {
        try {
            encomendaBean.criarEncomenda(false, FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(), farmaciaAtual.getNome());
            return "admin_farmacia_carrinho_index.xhtml";

        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_farmacia_carrinho_criar.xhtml";
    }

        //---------LINHAENCOMENDAS--------------
    public String setLinhaEncomendaAtualById(Long id) {
        linhaEncomendaAtual = linhaEncomendaBean.getLinhaEncomenda(id);
        return "admin_farmacia_carrinho_linha_editar.xhtml";
    }

    public List<LinhaEncomendaDTO> getlinhasEncomendas() {
        try {
            return linhaEncomendaBean.getAllLinhaEncomendas(encomendaAtual.getId());
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de Linhas de Encomendas.", logger);
            return null;
        }
    }

    public String alterarLinhaEncomenda() {
        try {
            linhaEncomendaBean.atualizalinhaEncomenda(linhaEncomendaAtual.getId(), linhaEncomendaAtual.getFornecedor(), linhaEncomendaAtual.getQuantidade());
            return "admin_farmacia_carrinho_linha?faces-redirect=true";
        } catch (EntidadeNaoExistenteException e) {
            FacesExceptionHandler.tratarExcecaoBinding(e, e.getMessage(), componente, logger);
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_farmacia_carrinho_linha_editar";
    }

    public LinhaEncomendaBean getLinhaEncomendaBean() {
        return linhaEncomendaBean;
    }

    public void setLinhaEncomendaBean(LinhaEncomendaBean linhaEncomendaBean) {
        this.linhaEncomendaBean = linhaEncomendaBean;
    }

    public LinhaEncomendaDTO getLinhaEncomendaAtual() {
        return linhaEncomendaAtual;
    }

    public void setLinhaEncomendaAtual(LinhaEncomendaDTO linhaEncomendaAtual) {
        this.linhaEncomendaAtual = linhaEncomendaAtual;
    }

    public LinhaEncomendaDTO getLinhaProdutoNovo() {
        return LinhaEncomendaNovo;
    }

    public String criarLinhaEncomenda() {
        try {
            linhaEncomendaBean.criarLinhaEncomenda(LinhaEncomendaNovo.getFornecedor(), encomendaAtual.getId(),
                    LinhaEncomendaNovo.getProduto(), LinhaEncomendaNovo.getQuantidade());
            LinhaEncomendaNovo.Reiniciar();
            return "admin_farmacia_carrinho_linha.xhtml";

        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema.", logger);
        }
        return "admin_farmacia_carrinho_linha.xhtml";
    }

    public UIComponent getComponente() {
        return componente;
    }

    public void setComponente(UIComponent componente) {
        this.componente = componente;
    }
}
